import java.util.*;

/*
 使用集合实现斗地主游戏的部分功能，要求如下：

 （1）首先准备 54 张扑克牌并打乱顺序。

 （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。

 （3）查看三个玩家手中的扑克牌和底牌。

 （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：

    手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
 */
public class HW5 {
    public static void main(String[] args){
    //创建一个Map集合,存储牌的索引和组装好的牌
    HashMap<Integer,String> poker = new HashMap<>();
    //创建一个List集合,存储牌的索引
    ArrayList pokerIndex = new ArrayList<>();
    //定义两个集合,存储花色和牌的序号
    String[] Colors = {"♠","♥","♣","♦"};
    String[] Numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    //把大王和小王存储到集合中
    //定义一个牌的索引
    int index = 0;
    //大王索引0
    poker.put(index,"大王");
    pokerIndex.add(index);
    index++;
    //小王索引为1
    poker.put(index,"小王");
    pokerIndex.add(index);
    index++;
    //两个循环初始化牌组,为每一个卡牌添加了一个索引值
    for (String number : Numbers) {
        for (String color : Colors) {
        poker.put(index,color+number);
        pokerIndex.add(index);
        index++;
        }
    }
    //洗索引
    Collections.shuffle(pokerIndex);

    //定义4个集合,存储玩家牌的索引,和底牌的索引
    ArrayList<Integer> player1 = new ArrayList<>();
    ArrayList<Integer> player2 = new ArrayList<>();
    ArrayList<Integer> player3 = new ArrayList<>();
    ArrayList<Integer> diPai = new ArrayList<>();
    //遍历存储牌索引的List集合,获取每一个牌的索引
    for (int i = 0; i <pokerIndex.size() ; i++) {
        Integer in = (Integer) pokerIndex.get(i);
        //先判断底牌
        if(i>=51){
            //给底牌发牌
            diPai.add(in);
        }else if(i%3==0){
            //给玩家1发牌
            player1.add(in);
        }else if(i%3==1){
            //给玩家2发牌
            player2.add(in);
        }else if(i%3==2){
            //给玩家3发牌
            player3.add(in);
        }
    }

    //排序
    Collections.sort(player1);
    Collections.sort(player2);
    Collections.sort(player3);
    Collections.sort(diPai);

    //打印手中的牌
    printPoker("players1",poker,player1);
    printPoker("players2",poker,player2);
    printPoker("players3",poker,player3);
    printPoker("底牌",poker,diPai);
}

    //遍历玩家或者底牌集合,获取牌的索引,使用牌的索引,去Map集合中,找到对应的牌
    public static void printPoker(String name, HashMap<Integer,String> poker, ArrayList<Integer> list){
        //输出玩家名称,不换行
        System.out.print(name+":");
        //遍历玩家或者底牌集合,获取牌的索引
        for (Integer key : list) {
            //使用牌的索引,去Map集合中,找到对应的牌
            String value = poker.get(key);
            System.out.print(value+" ");
        }
        System.out.println();//打印完每一个玩家的牌,换行
    }

}
